/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
// */
package controladores;

import gamebook.Foto;
import gamebook.Publicacion;
import gamebook.UsuarioGenerico;
import gamebook.Utilidades;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 *
 * @author JAVA
 */
public class multipartServlet extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String opcion = ""; //Opción de la acción que vamos a realizar
        String texto = ""; //Texto de la publicación
        String ruta = getServletContext().getContextPath();
        //Para guardar la imagen deberán cumplirse ciertas exigencias
        Foto foto = null;
        String nombreArchivo = "";
        File archivo = null;
        boolean hayFoto = false;

        try {
            //Cogemos el objeto sesión
            HttpSession session = request.getSession();
            //Usuario que maneja el ordenador
            UsuarioGenerico usuario = (UsuarioGenerico) session.getAttribute("usuario");
            //Usuario al que pertenece el muro que se está visitando
            UsuarioGenerico usuarioDestino = (UsuarioGenerico) session.getAttribute("usuariomuro");

            //Cogemos la ruta donde se guardará el archivo temporalmente
            File temporal = Utilidades.dameRuta(getServletContext().getRealPath("temporal")); //Ruta temporal

            //Cogemos la ruta donde se guardará el archivo definitivamente
            File destino = Utilidades.dameRuta(getServletContext().getRealPath("almacen"));

            //Establecemos cuál es la carpeta temporal
            DiskFileItemFactory dfif = new DiskFileItemFactory();
            dfif.setRepository(temporal);

            //...y demás cosas...
            ServletFileUpload sfu = new ServletFileUpload(dfif);

            //Cogemos la lista de datos del request
            List datos = sfu.parseRequest(request);
            //Y creamos un iterador para recorrerlos

            Iterator iterator = datos.iterator();

            while (iterator.hasNext()) {

                //Casteamos a FileItem
                FileItem item = (FileItem) iterator.next();

                if (!item.isFormField()) { //Si no es un campo de formulario es un archivo

                    String nombre = item.getName();
                    if (!nombre.isEmpty()) {
                        //Separamos el nombre del archivo de la ruta
                        String[] arrStr = item.getName().split(new String("\\\\"));
                        nombreArchivo = arrStr[arrStr.length - 1];

                        //Unimos el File destino (que es la ruta) y el String nombreArchivo
                        archivo = new File(destino, nombreArchivo);

                        //Comprobamos que sea un jpg y su tamaño sea mayor que cero
                        if (item.getContentType().equals("image/jpeg") && item.getSize() > 0) {
                            hayFoto = true;
                        } else {
                            hayFoto = false;
                        }

                        //Si hayFoto es true... guardamos la imagen con el nombre suyo
                        if (hayFoto) {
                            //Guardamos el archivo en la carpeta destino
                            item.write(archivo);
                        }
                    }
                } else {
                    //Estos serán campos de formulario normal
                    if (item.getFieldName().equals("opcion")) {
                        opcion = item.getString();
                    }
                    if (item.getFieldName().equals("texto")) {
                        texto = item.getString();
                    }
                }
            }

// Ahora que hemos guardado la foto (si la había) podemos hacer la acción que diga "opcion"

            if (opcion.equals("publicarPost")) {
                //Si la foto viene de una publicacion, creamos la publicación
                Publicacion publicacion = new Publicacion();
                publicacion.setContenido(texto);
                publicacion.setFecha(new Date());
                publicacion.setUsuarioDestino(usuarioDestino);
                publicacion.setUsuarioOrigen(usuario);
                if (hayFoto) {
                    //Usamos el constructor que nos asigna alto y ancho directamente
                    foto = new Foto(archivo);
                    //Faltan entonces por poner...
                    foto.setDescripcion(texto);
                    foto.setEsPerfil(false);
                    foto.setFecha(new Date());
                    foto.setUsuario(usuario);
                    foto.setEsPublicacion(true);
                    foto.darAlta();
                    //Creamos la copia en miniatura usando el (id)m.jpg
                    Utilidades.redimensionar(archivo, 140, 140, new File(destino, foto.getId() + "m.jpg"));

                    //Cambiamos el nombre a (id).jpg
                    archivo.renameTo(new File(destino, foto.getId() + ".jpg"));

                    publicacion.setFoto(foto);
                }
                publicacion.darAlta();
                //Guardado y nos vamos al muro/inicio
                response.sendRedirect(ruta + "/muro.jsp");
            } else if (opcion.equals("nuevaFoto")) {
                if (hayFoto) {
                    //Usamos el constructor que nos asigna alto y ancho directamente
                    foto = new Foto(archivo);
                    //Faltan entonces por poner...
                    foto.setDescripcion(texto);
                    foto.setEsPerfil(false);
                    foto.setFecha(new Date());
                    foto.setUsuario(usuario);
                    foto.setEsPublicacion(false);
                    foto.darAlta();
                    //Creamos la copia en miniatura usando el (id)m.jpg
                    Utilidades.redimensionar(archivo, 140, 140, new File(destino, foto.getId() + "m.jpg"));

                    //Cambiamos el nombre a (id).jpg
                    archivo.renameTo(new File(destino, foto.getId() + ".jpg"));
                }
                //Si la foto viene de subir una foto suelta, simplemente volvemos
                response.sendRedirect(ruta + "/fotos.jsp");
            } else if (opcion.equals("cambiarfoto")) {
                if (hayFoto) {
                    //Creamos la copia en miniatura usando el (id_usuario)pm.jpg
                    Utilidades.redimensionar(archivo, 48, 48, new File(destino, usuario.getId() + "pm.jpg"));

                    //Creamos la copia normal usando el (id_usuario)p.jpg
                    Utilidades.redimensionar(archivo, 140, 140, new File(destino, usuario.getId() + "p.jpg"));

                    //Borramos la original que no nos sirve pa na
                    archivo.delete();
                }
                //Volvemos al perfil
                response.sendRedirect(ruta + "/perfil.jsp");
            }

        } catch (Exception ex) {
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
